import { userStore } from '@/store/index.js';
import myAxios from '@/utils/axios.js';
// 导入RSA加密方法
import { encryptFun, getRefreshToken } from '@/utils/author.js';
// 🚨加密和解密的时候都需要使用JSON.stringify()方法将对象转换为字符串

/**
 * @description: 发送请求,获取RSA公钥
 * @return {String} 公钥
 */
async function GetPubKey() {
    let respon = await myAxios(
        {
            url: '/publicKey',
            method: 'get',
        },
        { default_err_msg: true }
    );
    return respon.publickey;
}

/**
 * @description: 用户登录方法
 * @param {Object} data 登录表单数据
 * @return {*} 登录Promise
 */
export async function userLogin(data) {
    let userData = JSON.stringify(data);
    // 登录过程
    // 获取加密密钥
    let pubKey = await GetPubKey();
    // 将表单信息与密钥进行RSA加密
    // 结果创建data对象
    let encryptData = {};
    encryptData.data = await encryptFun(pubKey, userData);
    return myAxios(
        {
            url: '/auth/login',
            method: 'post',
            data: JSON.stringify(encryptData),
        },
        { server_err_msg: true, custom_msg: true, default_err_msg: false },
        {
            mode: 'success',
            msg: '登录成功',
        }
    );
}

/**
 * @description:注册请求方法
 * @param {*} data 注册表单数据
 * @return {*} Promise
 */
export async function userSingin(data) {
    let singinData = JSON.stringify(data);
    let pubKey = await GetPubKey();
    // 将表单信息与密钥进行RSA加密
    // 结果创建data对象
    let encryptData = {};
    encryptData.data = await encryptFun(pubKey, singinData);
    return myAxios({
        url: '/auth/register',
        method: 'post',
        data: JSON.stringify(encryptData),
    });
}

/**
 * @description: 用户重置密码
 * @param {*} data 重置密码表单数据
 * @return {*}
 */
export async function userRenewPwd(data) {
    let pubKey = await GetPubKey();
    let emaliData = JSON.stringify(data);
    let encryptData = {};
    encryptData.data = await encryptFun(pubKey, emaliData);
    return myAxios({
        url: '/auth/resetpwd',
        method: 'post',
        data: JSON.stringify(encryptData),
    });
}

/**
 * @description: 获取邮箱验证码方法
 * @param {*} data 邮箱地址
 * @return {*} 用户信息Promise
 */
export async function getEmailCode(data) {
    let pubKey = await GetPubKey();
    let emaliData = JSON.stringify({ email: data });
    let encryptData = {};
    encryptData.data = await encryptFun(pubKey, emaliData);
    return myAxios({
        url: '/verificationcode/email',
        method: 'post',
        data: JSON.stringify(encryptData),
    });
}

/**
 * @description: 刷新Token方法
 * @return {*}
 */
export async function refreshToken() {
    // LocalStorege中获取长Token
    let refreshToken = getRefreshToken();
    myAxios({
        url: '/auth/refreshlogin',
        method: 'get',
        params: { refreshtoken: refreshToken },
    }).then(
        res => {
            if (res.hasOwnProperty('tokens')) {
                userStore.userToken = res.tokens;
            }
            console.log('Token刷新成功')
        }
    );
}

/**
 * @description: 获取用户信息方法
 * @return {*}
 */
export async function getUserInfo() {
    return myAxios({
        url: '/auth/info',
        method: 'get',
    });
}
